package br.com.foxinline.modelo;

import br.com.foxinline.enums.Status;
import br.com.foxinline.enums.TipoAverbacao;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.enums.TipoQualidade;
import br.com.foxinline.enums.TipoRequerimento;
import br.com.foxinline.generico.EntidadeGenerica;
import br.com.foxinline.validator.CNPJ;
import br.com.foxinline.validator.CPF;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;

/**
 *
 * @author elyjunior
 */
@Entity
public class Requerimento extends EntidadeGenerica {

    @Id
    @SequenceGenerator(sequenceName = "seq_requerimento", name = "seq_requerimento", allocationSize = 1)
    @GeneratedValue(generator = "seq_requerimento", strategy = GenerationType.SEQUENCE)
    private Long id;
    @Enumerated(EnumType.STRING)
    private TipoRequerimento tipoRequerimento;
    @Enumerated(EnumType.STRING)
    private TipoAverbacao tipoAverbacao;
    @Enumerated(EnumType.STRING)
    private TipoQualidade tipoQualidade;
    private String processo;
    // Dados do Interessado
    private String nomeInteressado;
    @CPF
    private String cpfInteressado;
    @CNPJ
    private String cnpjInteressado;
    @Enumerated(EnumType.STRING)
    private TipoDocumento tipoDocumentoInteressado;
    private String enderecoInteressado;
    private String numInteressado;
    private String bairroInteressado;
    private String telefoneInteressado;
    private String faxInteressado;
    private String cepInteressado;
    private String nomeFantasiaInteressado;
    // Dados Proprietário
    private String nomeProprietario;
    @CPF
    private String cpfProprietario;
    @CNPJ
    private String cnpjProprietario;
    @Enumerated(EnumType.STRING)
    private TipoDocumento tipoDocumentoProprietario;
    private String enderecoProprietario;
    private String numProprietario;
    private String bairroProprietario;
    private String telefoneProprietario;
    private String faxProprietario;
    private String cepProprietario;
    private String nomeFantasiaProprietario;
    //Dados do Terreno
    private String enderecoImovel;
    private String bairroImovel;
    private String numImovel;
    private String cepImovel;
    private boolean ativo;
    @Enumerated(EnumType.STRING)
    private Status status;
    @OneToMany
    List<TramiteRequerimento> tramites;
    @OneToOne
    private CaixaRequerimento caixaRequerimento;
    
   

    public Requerimento() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public TipoRequerimento getTipoRequerimento() {
        return tipoRequerimento;
    }

    public void setTipoRequerimento(TipoRequerimento tipoRequerimento) {
        this.tipoRequerimento = tipoRequerimento;
    }

    public TipoQualidade getTipoQualidade() {
        return tipoQualidade;
    }

    public void setTipoQualidade(TipoQualidade tipoQualidade) {
        this.tipoQualidade = tipoQualidade;
    }

    public String getNomeInteressado() {
        return nomeInteressado;
    }

    public void setNomeInteressado(String nomeInteressado) {
        this.nomeInteressado = nomeInteressado;
    }

    public String getCpfInteressado() {
        return cpfInteressado;
    }

    public void setCpfInteressado(String cpfInteressado) {
        this.cpfInteressado = cpfInteressado;
    }

    public String getCnpjInteressado() {
        return cnpjInteressado;
    }

    public void setCnpjInteressado(String cnpjInteressado) {
        this.cnpjInteressado = cnpjInteressado;
    }

    public String getEnderecoInteressado() {
        return enderecoInteressado;
    }

    public void setEnderecoInteressado(String enderecoInteressado) {
        this.enderecoInteressado = enderecoInteressado;
    }

    public String getNumInteressado() {
        return numInteressado;
    }

    public void setNumInteressado(String numInteressado) {
        this.numInteressado = numInteressado;
    }

    public String getBairroInteressado() {
        return bairroInteressado;
    }

    public void setBairroInteressado(String bairroInteressado) {
        this.bairroInteressado = bairroInteressado;
    }

    public String getTelefoneInteressado() {
        return telefoneInteressado;
    }

    public void setTelefoneInteressado(String telefoneInteressado) {
        this.telefoneInteressado = telefoneInteressado;
    }

    public String getFaxInteressado() {
        return faxInteressado;
    }

    public void setFaxInteressado(String faxInteressado) {
        this.faxInteressado = faxInteressado;
    }

    public String getNomeProprietario() {
        return nomeProprietario;
    }

    public void setNomeProprietario(String nomeProprietario) {
        this.nomeProprietario = nomeProprietario;
    }

    public String getCpfProprietario() {
        return cpfProprietario;
    }

    public void setCpfProprietario(String cpfProprietario) {
        this.cpfProprietario = cpfProprietario;
    }

    public String getCnpjProprietario() {
        return cnpjProprietario;
    }

    public void setCnpjProprietario(String cnpjProprietario) {
        this.cnpjProprietario = cnpjProprietario;
    }

    public TipoDocumento getTipoDocumentoInteressado() {
        return tipoDocumentoInteressado;
    }

    public void setTipoDocumentoInteressado(TipoDocumento tipoDocumentoInteressado) {
        this.tipoDocumentoInteressado = tipoDocumentoInteressado;
    }

    public TipoDocumento getTipoDocumentoProprietario() {
        return tipoDocumentoProprietario;
    }

    public void setTipoDocumentoProprietario(TipoDocumento tipoDocumentoProprietario) {
        this.tipoDocumentoProprietario = tipoDocumentoProprietario;
    }

    public String getEnderecoProprietario() {
        return enderecoProprietario;
    }

    public void setEnderecoProprietario(String enderecoProprietario) {
        this.enderecoProprietario = enderecoProprietario;
    }

    public String getNumProprietario() {
        return numProprietario;
    }

    public void setNumProprietario(String numProprietario) {
        this.numProprietario = numProprietario;
    }

    public String getBairroProprietario() {
        return bairroProprietario;
    }

    public void setBairroProprietario(String bairroProprietario) {
        this.bairroProprietario = bairroProprietario;
    }

    public String getTelefoneProprietario() {
        return telefoneProprietario;
    }

    public void setTelefoneProprietario(String telefoneProprietario) {
        this.telefoneProprietario = telefoneProprietario;
    }

    public String getFaxProprietario() {
        return faxProprietario;
    }

    public void setFaxProprietario(String faxProprietario) {
        this.faxProprietario = faxProprietario;
    }

    public String getEnderecoImovel() {
        return enderecoImovel;
    }

    public void setEnderecoImovel(String enderecoImovel) {
        this.enderecoImovel = enderecoImovel;
    }

    public String getBairroImovel() {
        return bairroImovel;
    }

    public void setBairroImovel(String bairroImovel) {
        this.bairroImovel = bairroImovel;
    }

    public String getNumImovel() {
        return numImovel;
    }

    public void setNumImovel(String numImovel) {
        this.numImovel = numImovel;
    }

    public String getCepImovel() {
        return cepImovel;
    }

    public void setCepImovel(String cepImovel) {
        this.cepImovel = cepImovel;
    }

    public String getCepInteressado() {
        return cepInteressado;
    }

    public void setCepInteressado(String cepInteressado) {
        this.cepInteressado = cepInteressado;
    }

    public String getNomeFantasiaInteressado() {
        return nomeFantasiaInteressado;
    }

    public void setNomeFantasiaInteressado(String nomeFantasiaInteressado) {
        this.nomeFantasiaInteressado = nomeFantasiaInteressado;
    }

    public String getCepProprietario() {
        return cepProprietario;
    }

    public void setCepProprietario(String cepProprietario) {
        this.cepProprietario = cepProprietario;
    }

    public String getNomeFantasiaProprietario() {
        return nomeFantasiaProprietario;
    }

    public void setNomeFantasiaProprietario(String nomeFantasiaProprietario) {
        this.nomeFantasiaProprietario = nomeFantasiaProprietario;
    }

    public String getProcesso() {
        return processo;
    }

    public void setProcesso(String processo) {
        this.processo = processo;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public List<TramiteRequerimento> getTramites() {
        return tramites;
    }

    public void setTramites(List<TramiteRequerimento> tramites) {
        this.tramites = tramites;
    }
 
    public CaixaRequerimento getCaixaRequerimento() {
        return caixaRequerimento;
    }

    public void setCaixaRequerimento(CaixaRequerimento caixaRequerimento) {
        this.caixaRequerimento = caixaRequerimento;
    }

    public TipoAverbacao getTipoAverbacao() {
        return tipoAverbacao;
    }

    public void setTipoAverbacao(TipoAverbacao tipoAverbacao) {
        this.tipoAverbacao = tipoAverbacao;
    }

     
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 97 * hash + (this.tipoRequerimento != null ? this.tipoRequerimento.hashCode() : 0);
        hash = 97 * hash + (this.tipoQualidade != null ? this.tipoQualidade.hashCode() : 0);
        hash = 97 * hash + (this.processo != null ? this.processo.hashCode() : 0);
        hash = 97 * hash + (this.nomeInteressado != null ? this.nomeInteressado.hashCode() : 0);
        hash = 97 * hash + (this.cpfInteressado != null ? this.cpfInteressado.hashCode() : 0);
        hash = 97 * hash + (this.cnpjInteressado != null ? this.cnpjInteressado.hashCode() : 0);
        hash = 97 * hash + (this.tipoDocumentoInteressado != null ? this.tipoDocumentoInteressado.hashCode() : 0);
        hash = 97 * hash + (this.enderecoInteressado != null ? this.enderecoInteressado.hashCode() : 0);
        hash = 97 * hash + (this.numInteressado != null ? this.numInteressado.hashCode() : 0);
        hash = 97 * hash + (this.bairroInteressado != null ? this.bairroInteressado.hashCode() : 0);
        hash = 97 * hash + (this.telefoneInteressado != null ? this.telefoneInteressado.hashCode() : 0);
        hash = 97 * hash + (this.faxInteressado != null ? this.faxInteressado.hashCode() : 0);
        hash = 97 * hash + (this.cepInteressado != null ? this.cepInteressado.hashCode() : 0);
        hash = 97 * hash + (this.nomeFantasiaInteressado != null ? this.nomeFantasiaInteressado.hashCode() : 0);
        hash = 97 * hash + (this.nomeProprietario != null ? this.nomeProprietario.hashCode() : 0);
        hash = 97 * hash + (this.cpfProprietario != null ? this.cpfProprietario.hashCode() : 0);
        hash = 97 * hash + (this.cnpjProprietario != null ? this.cnpjProprietario.hashCode() : 0);
        hash = 97 * hash + (this.tipoDocumentoProprietario != null ? this.tipoDocumentoProprietario.hashCode() : 0);
        hash = 97 * hash + (this.enderecoProprietario != null ? this.enderecoProprietario.hashCode() : 0);
        hash = 97 * hash + (this.numProprietario != null ? this.numProprietario.hashCode() : 0);
        hash = 97 * hash + (this.bairroProprietario != null ? this.bairroProprietario.hashCode() : 0);
        hash = 97 * hash + (this.telefoneProprietario != null ? this.telefoneProprietario.hashCode() : 0);
        hash = 97 * hash + (this.faxProprietario != null ? this.faxProprietario.hashCode() : 0);
        hash = 97 * hash + (this.cepProprietario != null ? this.cepProprietario.hashCode() : 0);
        hash = 97 * hash + (this.nomeFantasiaProprietario != null ? this.nomeFantasiaProprietario.hashCode() : 0);
        hash = 97 * hash + (this.enderecoImovel != null ? this.enderecoImovel.hashCode() : 0);
        hash = 97 * hash + (this.bairroImovel != null ? this.bairroImovel.hashCode() : 0);
        hash = 97 * hash + (this.numImovel != null ? this.numImovel.hashCode() : 0);
        hash = 97 * hash + (this.cepImovel != null ? this.cepImovel.hashCode() : 0);
        hash = 97 * hash + (this.caixaRequerimento != null ? this.caixaRequerimento.hashCode() : 0);

        hash = 97 * hash + (this.ativo ? 1 : 0);
        hash = 97 * hash + (this.status != null ? this.status.hashCode() : 0);
        hash = 97 * hash + (this.tramites != null ? this.tramites.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Requerimento other = (Requerimento) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.tipoRequerimento != other.tipoRequerimento) {
            return false;
        }
        if (this.tipoQualidade != other.tipoQualidade) {
            return false;
        }
        if ((this.processo == null) ? (other.processo != null) : !this.processo.equals(other.processo)) {
            return false;
        }
        if ((this.nomeInteressado == null) ? (other.nomeInteressado != null) : !this.nomeInteressado.equals(other.nomeInteressado)) {
            return false;
        }
        if ((this.cpfInteressado == null) ? (other.cpfInteressado != null) : !this.cpfInteressado.equals(other.cpfInteressado)) {
            return false;
        }
        if ((this.cnpjInteressado == null) ? (other.cnpjInteressado != null) : !this.cnpjInteressado.equals(other.cnpjInteressado)) {
            return false;
        }
        if (this.tipoDocumentoInteressado != other.tipoDocumentoInteressado) {
            return false;
        }
        if ((this.enderecoInteressado == null) ? (other.enderecoInteressado != null) : !this.enderecoInteressado.equals(other.enderecoInteressado)) {
            return false;
        }
        if ((this.numInteressado == null) ? (other.numInteressado != null) : !this.numInteressado.equals(other.numInteressado)) {
            return false;
        }
        if ((this.bairroInteressado == null) ? (other.bairroInteressado != null) : !this.bairroInteressado.equals(other.bairroInteressado)) {
            return false;
        }
        if ((this.telefoneInteressado == null) ? (other.telefoneInteressado != null) : !this.telefoneInteressado.equals(other.telefoneInteressado)) {
            return false;
        }
        if ((this.faxInteressado == null) ? (other.faxInteressado != null) : !this.faxInteressado.equals(other.faxInteressado)) {
            return false;
        }
        if ((this.cepInteressado == null) ? (other.cepInteressado != null) : !this.cepInteressado.equals(other.cepInteressado)) {
            return false;
        }
        if ((this.nomeFantasiaInteressado == null) ? (other.nomeFantasiaInteressado != null) : !this.nomeFantasiaInteressado.equals(other.nomeFantasiaInteressado)) {
            return false;
        }
        if ((this.nomeProprietario == null) ? (other.nomeProprietario != null) : !this.nomeProprietario.equals(other.nomeProprietario)) {
            return false;
        }
        if ((this.cpfProprietario == null) ? (other.cpfProprietario != null) : !this.cpfProprietario.equals(other.cpfProprietario)) {
            return false;
        }
        if ((this.cnpjProprietario == null) ? (other.cnpjProprietario != null) : !this.cnpjProprietario.equals(other.cnpjProprietario)) {
            return false;
        }
        if (this.tipoDocumentoProprietario != other.tipoDocumentoProprietario) {
            return false;
        }
        if ((this.enderecoProprietario == null) ? (other.enderecoProprietario != null) : !this.enderecoProprietario.equals(other.enderecoProprietario)) {
            return false;
        }
        if ((this.numProprietario == null) ? (other.numProprietario != null) : !this.numProprietario.equals(other.numProprietario)) {
            return false;
        }
        if ((this.bairroProprietario == null) ? (other.bairroProprietario != null) : !this.bairroProprietario.equals(other.bairroProprietario)) {
            return false;
        }
        if ((this.telefoneProprietario == null) ? (other.telefoneProprietario != null) : !this.telefoneProprietario.equals(other.telefoneProprietario)) {
            return false;
        }
        if ((this.faxProprietario == null) ? (other.faxProprietario != null) : !this.faxProprietario.equals(other.faxProprietario)) {
            return false;
        }
        if ((this.cepProprietario == null) ? (other.cepProprietario != null) : !this.cepProprietario.equals(other.cepProprietario)) {
            return false;
        }
        if ((this.nomeFantasiaProprietario == null) ? (other.nomeFantasiaProprietario != null) : !this.nomeFantasiaProprietario.equals(other.nomeFantasiaProprietario)) {
            return false;
        }
        if ((this.enderecoImovel == null) ? (other.enderecoImovel != null) : !this.enderecoImovel.equals(other.enderecoImovel)) {
            return false;
        }
        if ((this.bairroImovel == null) ? (other.bairroImovel != null) : !this.bairroImovel.equals(other.bairroImovel)) {
            return false;
        }
        if ((this.numImovel == null) ? (other.numImovel != null) : !this.numImovel.equals(other.numImovel)) {
            return false;
        }
        if ((this.cepImovel == null) ? (other.cepImovel != null) : !this.cepImovel.equals(other.cepImovel)) {
            return false;
        }

        if (this.ativo != other.ativo) {
            return false;
        }
        if (this.status != other.status) {
            return false;
        }
        if (this.tramites != other.tramites && (this.tramites == null || !this.tramites.equals(other.tramites))) {
            return false;
        }
        if (this.caixaRequerimento != other.caixaRequerimento && (this.caixaRequerimento == null || !this.caixaRequerimento.equals(other.caixaRequerimento))) {
            return false;
        }
        return true;
    }
}
